/*
 ============================================================================
 Name        : Tp0.c
 Author      : Santiago Storti
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
#include "Errores.h"
#include "Archivo.h"
#include "Controlar.h"
#include "Imprimir_stdin.h"
#include "Ayuda.h"
#include <getopt.h>

void cargar_stdin();
int procesarArchivo ( const char* nombre );

int main(int argc, char** argv)
{
	int next_option;

	const char* const short_options = "hV";
	const struct option long_options[] = {
	{ "help"	, 0, NULL, 'h' },
	{ "version"	, 0, NULL, 'V' },
	{ NULL, 0, NULL, 0 } };


	do {
		next_option = getopt_long (argc, argv, short_options, long_options, NULL);

		switch (next_option)
		{
			case 'h':
				mostrarAyuda( argv[0] );
				exit(0);
			case 'V':
				mostrarVersion();
				exit(0);
			case '?': //opcion invalida
				mostrarAyuda( argv[0] );
				exit(0); //no lo consideramos error
			case -1: //
				break;
			default:
				break;
		}

	} while (next_option != -1);


	int retorno = 0;

	switch ( argc )
	{
	case 1:
	{
		cargar_stdin();
		break;
	}
	case 2:
	{
		retorno = procesarArchivo ( argv[1] );
		break;
	}
	default:
	{
		int i, cantArchivos;

		cantArchivos = argc - 1;

		for ( i = 1; i <= cantArchivos; i ++ )
		{

			if ( procesarArchivo ( argv[i] ) != 0 )
				retorno = 1;
		}
		break;
	}
	}

    return retorno;
}

int procesarArchivo ( const char* nombre )
{
	if ( is_regular ( nombre ) !=0 )
	{
		escribirArchAlReves ( nombre );
		return 0;
	}
	else
	{
		return 1;
	}
}

void cargar_stdin() {
	long lSize = 20;
	void* bufferAux=NULL;
	void * buffer=NULL;
	int result;
	int tamanoAcumulado = 0;

	bufferAux =  malloc (sizeof(char)*(lSize));
	if (bufferAux==NULL) {
		mem_error();
	}

	buffer =  malloc (sizeof(char)*(lSize));
	if (buffer==NULL){
		free(bufferAux);
		mem_error();
	}

	memset(bufferAux, 0, lSize);
	memset(buffer, 0, lSize);

	result = fread(bufferAux, sizeof(char),lSize, stdin);

	if (result>0) {
		memcpy(buffer,bufferAux,result);
		tamanoAcumulado += result;
	}


	while( !feof(stdin) ) {
		memset(bufferAux, 0, lSize);
		result = fread(bufferAux, sizeof(char), lSize, stdin);
		buffer = realloc (buffer, sizeof(char)*(tamanoAcumulado+result));
		if (buffer == NULL) {
			free(bufferAux);
			mem_error();
		}
		void* aux = buffer+tamanoAcumulado;
		memcpy(aux,bufferAux,result);
		tamanoAcumulado +=  result;
	}

	int res = imprimir_lineas_buffer(buffer,tamanoAcumulado);
	free (buffer);
	free (bufferAux);
	if (res==-1)
		write_error();

}
